// 基于axios封装的请求模块
import axios from 'axios'
import { removeToken, getToken, setToken } from '@/utils/token'
import router from '@/router'
import { Notify } from 'vant'
import { refreshTokenAPI } from '@/api'
// 新建一个新的axios实例
const request = axios.create({
  // baseURL: 'http://geek.itheima.net',
  baseURL: 'http://toutiao.itheima.net',
  timeout: 8000
})

// 添加请求拦截器
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // console.dir(config)
  // 如果request那边传请求头和Authorization证明那边要自定义，所以这里不能进去被覆盖
  // 只有本次请求头里没有Authorization字段，我才需要携带上token

  if (config.headers.Authorization === undefined) {
    config.headers.Authorization = `Bearer ${getToken()}`
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response
}, async function (error) {
  // 对响应错误做点什么
  if (error.response.status === 401) {
    removeToken() // 移除token
    // router.replace('/login')
    console.dir(error)
    // 方式二  用户无感知刷新token
    const res = await refreshTokenAPI()
    // console.log(res)
    setToken(res.data.data.token)
    // error.config里请求头还带着错的token,更新一下
    // error->逻辑页面(例如:不感兴趣接口调用报的错)
    // error.config是不感兴趣相关的参数对象
    error.config.headers.Authorization = 'Bearer ' + res.data.data.token

    // 原地新发起的Promise对象, 也要return出去
    // 最开始第一次发起请求的逻辑页面
    return axios(error.config) // 把未完成的请求对象, 再装入回去, 重新发送一次请求
  } else if (error.response.status === 500 && error.config.url === '/v1_0/authorizations') {
    Notify({ type: 'danger', message: '请重新登录' })
    // 清除两个token
    removeToken() // 移除token
    localStorage.removeItem('refresh_token') // 移除refresh_token
    router.replace({
      path: '/login',
      query: {
        pa: router.currentRoute.fullPath// 登录未遂的当前页面的路由地址，传给登录页面
      }
    })
  }
  // 对响应错误做些什么
  return Promise.reject(error)
})

// 导出自定义函数,参数对象解构赋值
export default ({ url, method = 'GET', params, data, headers }) => {
  return request({
    url,
    method,
    params,
    data,
    headers
  })
}

//   if (method.toUppercase() === 'GET') {
//     // 自己把params参数拼接在url?后面
//   }
//   $.ajax({
//     url: url,
//     data: data, //  没有params
//     type: method,
//     headers
//   })

/*
$.ajax({
    url: '请求地址',
    data: {}, //  没有params
    type: '请求方式'
})
*/
